/*
 * This file contains some defines for the AT-hd-controller.
 * Various sources. Check out some definitions (see comments with
 * a ques).
 */
#ifndef _HDREG_H
#define _HDREG_H

/* Hd controller regs. Ref: IBM AT Bios-listing 参见表9-3 AT 硬盘控制器寄存器端口及作用 */
#define HD_DATA		0x1f0	/* _CTL when writing 数据寄存器（基于IN、OUT系列指令，传输1~2字节数据） */
#define HD_ERROR	0x1f1	/* see err-bits 硬盘控制器错误寄存器端口 */
#define HD_NSECTOR	0x1f2	/* nr of sectors to read/write 扇区数 */
#define HD_SECTOR	0x1f3	/* starting sector 起始扇区 */
#define HD_LCYL		0x1f4	/* starting cylinder  柱面号低字节 */
#define HD_HCYL		0x1f5	/* high byte of starting cyl 柱面号高字节 */
#define HD_CURRENT	0x1f6	/* 101dhhhh , d=drive, hhhh=head 驱动器号/磁头号 */
#define HD_STATUS	0x1f7	/* see status-bits 硬盘控制器主状态寄存器端口 */
#define HD_PRECOMP HD_ERROR	/* same io address, read=error, write=precomp  写前预补偿寄存器*/
#define HD_COMMAND HD_STATUS	/* same io address, read=status, write=cmd 硬盘控制器命令寄存器端口 */

#define HD_CMD		0x3f6   /* 硬盘控制寄存器 */

/* Bits of HD_STATUS */
#define ERR_STAT	0x01    /* 命令执行错误。当该位置位时，表示前一个命令以出错结束。 */
#define INDEX_STAT	0x02	/* 收到索引。当磁盘旋转遇到索引标志时会设置该位。*/
#define ECC_STAT	0x04	/* Corrected error ，表示一个可恢复的数据错误而且已得到纠正 */
#define DRQ_STAT	0x08	/* 数据请求服务。当该位被置位时，表示驱动器已经准备好在主机和数据端口之间传输一个扇区的数据。*/
#define SEEK_STAT	0x10    /* 驱动器寻道结束。当该位被置位时，表示寻道操作已经完成，磁头已经停在指定的磁道上。*/
#define WRERR_STAT	0x20    /* 驱动器写操作故障 */
#define READY_STAT	0x40    /* 驱动器准备好（就绪）。表示驱动器已经准备好接收命令。 */
#define BUSY_STAT	0x80    /* 控制器忙碌，此时主机不能发送命令块 */

/* Values for HD_COMMAND 各种硬盘控制器命令（让驱动器做出响应操作），每个指令结束后，都会然后产生一个硬盘中断（hd_interrupt） */  
#define WIN_RESTORE		0x10    /* 驱动器重新校正（复位）。该命令把读/写磁头从磁盘上任何位置移动到 0 柱面，然后产生一个中断 */
#define WIN_READ		0x20
#define WIN_WRITE		0x30
#define WIN_VERIFY		0x40
#define WIN_FORMAT		0x50
#define WIN_INIT		0x60
#define WIN_SEEK 		0x70
#define WIN_DIAGNOSE	0x90
#define WIN_SPECIFY		0x91	/* 建立驱动器参数(复位)：设置两个寄存器的值，然后产生一个中断 */

/* Bits for HD_ERROR */
#define MARK_ERR	0x01	/* Bad address mark ? */
#define TRK0_ERR	0x02	/* couldn't find track 0 */
#define ABRT_ERR	0x04	/* ? */
#define ID_ERR		0x10	/* ? */
#define ECC_ERR		0x40	/* ? */
#define	BBD_ERR		0x80	/* ? */

struct partition {
	unsigned char boot_ind;		/* 0x80 - active (unused) */
	unsigned char head;		/* ? */
	unsigned char sector;		/* ? */
	unsigned char cyl;		/* ? */
	unsigned char sys_ind;		/* ? */
	unsigned char end_head;		/* ? */
	unsigned char end_sector;	/* ? */
	unsigned char end_cyl;		/* ? */
	unsigned int start_sect;	/* starting sector counting from 0 */
	unsigned int nr_sects;		/* nr of sectors in partition */
};

#endif
